home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / gfx / misc / gnuplot-3.7src.lha / gnuplot-3.7src / gnuplot-3.7.lha / gnuplot-3.7 / term / hpljii.trm < prev    next >
Text File  |  1998-12-15  |  12KB  |  431 lines

  1. /*
  2.  * $Id: hpljii.trm,v 1.20 1998/04/14 00:17:51 drd Exp $
  3.  *
  4.  */
  5.  
  6. /* GNUPLOT - hpljii.trm */
  7.  
  8. /*[
  9.  * Copyright 1990 - 1993, 1998   Thomas Williams, Colin Kelley
  10.  *
  11.  * Permission to use, copy, and distribute this software and its
  12.  * documentation for any purpose with or without fee is hereby granted,
  13.  * provided that the above copyright notice appear in all copies and
  14.  * that both that copyright notice and this permission notice appear
  15.  * in supporting documentation.
  16.  *
  17.  * Permission to modify the software is granted, but not the right to
  18.  * distribute the complete modified source code.  Modifications are to
  19.  * be distributed as patches to the released version.  Permission to
  20.  * distribute binaries produced by compiling modified sources is granted,
  21.  * provided you
  22.  *   1. distribute the corresponding source modifications from the
  23.  *    released version in the form of a patch file along with the binaries,
  24.  *   2. add special version identification to distinguish your version
  25.  *    in addition to the base release version number,
  26.  *   3. provide your name and address as the primary contact for the
  27.  *    support of your modified version, and
  28.  *   4. retain our contact information in regard to use of the base
  29.  *    software.
  30.  * Permission to distribute the released version of the source code along
  31.  * with corresponding source modifications in the form of a patch file is
  32.  * granted with same provisions 2 through 4 for binary distributions.
  33.  *
  34.  * This software is provided "as is" without express or implied warranty
  35.  * to the extent permitted by applicable law.
  36. ]*/
  37.  
  38. /*
  39.  * This file is included by ../term.c.
  40.  *
  41.  * This terminal driver supports:
  42.  *  hpljii, hpdj
  43.  *
  44.  * AUTHORS
  45.  *  John Engels
  46.  *  Russell Lang
  47.  *  Maurice Castro
  48.  *
  49.  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
  50.  * 
  51.  */
  52.  
  53. /* The following HP laserjet series II driver uses generic bit mapped graphics
  54.    routines from bitmap.c to build up a bit map in memory.  The driver
  55.    interchanges colomns and lines in order to access entire lines
  56.    easily and returns the lines to get bits in the right order :
  57.    (x,y) -> (y,XMAX-1-x). */
  58. /* This interchange is done by calling b_makebitmap() with reversed 
  59.    xmax and ymax, and then setting b_rastermode to TRUE.  b_setpixel()
  60.    will then perform the interchange before each pixel is plotted */
  61. /* by John Engels JENGELS@BNANDP51.BITNET, inspired by the hpljet driver
  62.    of Jyrki Yli-Nokari */
  63.  
  64. /*
  65.  * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
  66.  */
  67.  
  68. #include "driver.h"
  69.  
  70. #ifdef TERM_REGISTER
  71. register_term(hpljii)
  72. register_term(hpdj)
  73. #endif
  74.  
  75. #ifdef TERM_PROTO
  76. TERM_PUBLIC void HPLJIIoptions __PROTO((void));
  77. TERM_PUBLIC void HPLJIIinit __PROTO((void));
  78. TERM_PUBLIC void HPLJIIgraphics __PROTO((void));
  79. TERM_PUBLIC void HPLJIItext __PROTO((void));
  80. TERM_PUBLIC void HPLJIIlinetype __PROTO((int linetype));
  81. TERM_PUBLIC void HPLJIIput_text __PROTO((unsigned int x, unsigned int y, char *str));
  82. TERM_PUBLIC void HPLJIIreset __PROTO((void));
  83. #define HPLJIImove b_move
  84. #define HPLJIIvector b_vector
  85. #define HPLJIItext_angle b_text_angle
  86. TERM_PUBLIC void HPDJgraphics __PROTO((void));
  87. TERM_PUBLIC void HPDJtext __PROTO((void));
  88. #define HPDJtext_angle b_text_angle
  89. #define HPDJput_text b_put_text
  90. /* default values for term_tbl */
  91. #define HPLJII_75PPI_XMAX (1920/4)
  92. #define HPLJII_75PPI_YMAX (1920/4)
  93. #define HPLJII_75PPI_HCHAR (1920/4/6)
  94. #define HPLJII_75PPI_VCHAR (1920/4/10)
  95. #define HPLJII_75PPI_VTIC 5
  96. #define HPLJII_75PPI_HTIC 5
  97. #endif
  98.  
  99. #ifndef TERM_PROTO_ONLY
  100. #ifdef TERM_BODY
  101.  
  102. /* We define 4 different print qualities : 300ppi, 150ppi, 100ppi and
  103.    75ppi.  (Pixel size = 1, 2, 3, 4 dots) */
  104.  
  105. #define HPLJII_DPP (hplj_dpp)    /* dots per pixel */
  106. #define HPLJII_PPI (300/HPLJII_DPP)    /* pixel per inch */
  107. /* make XMAX and YMAX a multiple of 8 */
  108. #define HPLJII_XMAX (8*(unsigned int)(xsize*1920/HPLJII_DPP/8.0+0.9))
  109. #define HPLJII_YMAX (8*(unsigned int)(ysize*1920/HPLJII_DPP/8.0+0.9))
  110.  
  111. /* Courier font with 6 lines per inch */
  112. #define HPLJII_VCHAR (HPLJII_PPI/6)
  113. /* Courier font with 10 caracters per inch */
  114. #define HPLJII_HCHAR (HPLJII_PPI/10)
  115. /* Save current cursor position */
  116. #define HPLJII_PUSH_CURSOR fputs("\033&f0S",gpoutfile)
  117. /* Restore cursor position */
  118. #define HPLJII_POP_CURSOR fputs("\033&f1S",gpoutfile)
  119. /* be sure to use courier font with 6lpi and 10cpi */
  120. #define HPLJII_COURIER fputs("\033(0N\033(s0p10.0h12.0v0s0b3T\033&l6D",gpoutfile)
  121.  
  122.  
  123. void HPLJIIputc __PROTO((unsigned int x, unsigned int y, char c, int ang));
  124. static int hplj_dpp = 4;
  125. /* bm_pattern not appropriate for 300ppi graphics */
  126. #ifndef GOT_300_PATTERN
  127. # define GOT_300_PATTERN
  128. static unsigned int b_300ppi_pattern[] =
  129. {
  130.     0xffff, 0x1111, 0xffff, 0x3333,
  131.     0x0f0f, 0x3f3f, 0x0fff, 0x00ff, 0x33ff
  132. };
  133. #endif
  134.  
  135. TERM_PUBLIC void HPLJIIoptions()
  136. {
  137.     char opt[4];
  138.     int parse_error = 0;
  139.  
  140.     if (END_OF_COMMAND) {
  141.     term_options[0] = NUL;
  142.     } else {
  143.     if (token[c_token].length > 3) {
  144.         parse_error = 1;    /* see below */
  145.     } else {
  146.         /* almost_equals() won't accept numbers - use strcmp() instead */
  147.         capture(opt, c_token, c_token, 4);
  148.         if (!strcmp(opt, "75")) {
  149.         hplj_dpp = 4;
  150.         } else if (!strcmp(opt, "100")) {
  151.         hplj_dpp = 3;
  152.         } else if (!strcmp(opt, "150")) {
  153.         hplj_dpp = 2;
  154.         } else if (!strcmp(opt, "300")) {
  155.         hplj_dpp = 1;
  156.         } else {
  157.         /* error, but set dpi anyway, since term it already set */
  158.         parse_error = 1;
  159.         }
  160.         c_token++;
  161.     }
  162.     }
  163.  
  164.     term->xmax = HPLJII_XMAX;
  165.     term->ymax = HPLJII_YMAX;
  166.     switch (hplj_dpp) {
  167.     case 1:
  168.     strcpy(term_options, "300");
  169.     term->v_tic = 15;
  170.     term->h_tic = 15;
  171.     break;
  172.     case 2:
  173.     strcpy(term_options, "150");
  174.     term->v_tic = 8;
  175.     term->h_tic = 8;
  176.     break;
  177.     case 3:
  178.     strcpy(term_options, "100");
  179.     term->v_tic = 6;
  180.     term->h_tic = 6;
  181.     break;
  182.     case 4:
  183.     strcpy(term_options, "75");
  184.     term->v_tic = 5;
  185.     term->h_tic = 5;
  186.     break;
  187.     }
  188.  
  189.     if (parse_error)
  190.     int_error("expecting dots per inch size 75, 100, 150 or 300",
  191.           c_token);
  192. }
  193.  
  194.  
  195. TERM_PUBLIC void HPLJIIinit()
  196. {
  197.     term->v_char = HPLJII_VCHAR;
  198.     term->h_char = HPLJII_HCHAR;
  199. }
  200.  
  201.  
  202. TERM_PUBLIC void HPLJIIgraphics()
  203. {
  204.     HPLJII_COURIER;
  205.     HPLJII_PUSH_CURSOR;
  206.     /* rotate plot -90 degrees by reversing XMAX and YMAX and by 
  207.        setting b_rastermode to TRUE */
  208.     b_makebitmap(HPLJII_YMAX, HPLJII_XMAX, 1);
  209.     b_rastermode = TRUE;
  210. }
  211.  
  212.  
  213. /* HPLJIItext by rjl - no compression */
  214. TERM_PUBLIC void HPLJIItext()
  215. {
  216.     register int x, j, row;
  217.  
  218.     fprintf(gpoutfile, "\033*t%dR", HPLJII_PPI);
  219.     HPLJII_POP_CURSOR;
  220.     fputs("\033*r1A", gpoutfile);
  221.  
  222.     /* dump bitmap in raster mode */
  223.     for (x = b_xsize - 1; x >= 0; x--) {
  224.     row = (b_ysize / 8) - 1;
  225.     fprintf(gpoutfile, "\033*b0m%dW", b_ysize / 8);
  226.     for (j = row; j >= 0; j--) {
  227.         (void) fputc((char) (*((*b_p)[j] + x)), gpoutfile);
  228.     }
  229.     }
  230.     fputs("\033*rB", gpoutfile);
  231.  
  232.     b_freebitmap();
  233.  
  234. #ifndef VMS
  235.     /* most vms spoolers add a formfeed character */
  236.     putc('\f', gpoutfile);
  237. #endif /* !VMS */
  238. }
  239.  
  240.  
  241.  
  242. TERM_PUBLIC void HPLJIIlinetype(linetype)
  243. int linetype;
  244. {
  245.  
  246.     if (hplj_dpp == 1) {
  247.     if (linetype >= 7)
  248.         linetype %= 7;
  249.     /* b_pattern not appropriate for 300ppi graphics */
  250.     b_linemask = b_300ppi_pattern[linetype + 2];
  251.     b_maskcount = 0;
  252.     } else {
  253.     b_setlinetype(linetype);
  254.     }
  255. }
  256.  
  257. TERM_PUBLIC void HPLJIIput_text(x, y, str)
  258. unsigned int x, y;
  259. char *str;
  260. {
  261.     switch (b_angle) {
  262.     case 0:
  263.     y -= HPLJII_VCHAR / 5;
  264.     HPLJII_POP_CURSOR;
  265.     HPLJII_PUSH_CURSOR;
  266.     /* (0,0) is the upper left point of the paper */
  267.     fprintf(gpoutfile, "\033*p%+dx%+dY", x * HPLJII_DPP
  268.         ,(HPLJII_YMAX - y - 1) * HPLJII_DPP);
  269.     fputs(str, gpoutfile);
  270. /*       for (; *str; ++str, x += HPLJII_HCHAR)
  271.             HPLJIIputc (x, y, *str, b_angle);*/
  272.     break;
  273.     case 1:
  274.     y += (HPLJII_HCHAR - 2 * HPLJII_VCHAR) / 2;
  275.     y += (HPLJII_VCHAR + HPLJII_HCHAR) * strlen(str) / 2;
  276.     for (; *str; ++str, y -= HPLJII_VCHAR)
  277.         HPLJIIputc(x, y, *str, b_angle);
  278.     break;
  279.     }
  280. }
  281.  
  282. #ifdef PROTOTYPES
  283. void HPLJIIputc(unsigned int x, unsigned int y, char c, int ang)
  284. #else
  285. void HPLJIIputc(x, y, c, ang)
  286. unsigned int x, y;
  287. int ang;
  288. char c;
  289. #endif
  290. {
  291.     HPLJII_POP_CURSOR;
  292.     HPLJII_PUSH_CURSOR;
  293.     /* (0,0) is the upper left point of the paper */
  294.     fprintf(gpoutfile, "\033*p%+dx%+dY", x * HPLJII_DPP
  295.         ,(HPLJII_YMAX - y - 1) * HPLJII_DPP);
  296.     fputc(c, gpoutfile);
  297. }
  298.  
  299.  
  300. TERM_PUBLIC void HPLJIIreset()
  301. {
  302. #ifdef VMS
  303.     fflush_binary();
  304. #endif /* VMS */
  305. }
  306.  
  307.  
  308. /* HP DeskJet routines */
  309. TERM_PUBLIC void HPDJgraphics()
  310. {
  311.     switch (hplj_dpp) {
  312.     case 1:
  313.     b_charsize(FNT13X25);
  314.     term->v_char = FNT13X25_VCHAR;
  315.     term->h_char = FNT13X25_HCHAR;
  316.     break;
  317.     case 2:
  318.     b_charsize(FNT13X25);
  319.     term->v_char = FNT13X25_VCHAR;
  320.     term->h_char = FNT13X25_HCHAR;
  321.     break;
  322.     case 3:
  323.     b_charsize(FNT9X17);
  324.     term->v_char = FNT9X17_VCHAR;
  325.     term->h_char = FNT9X17_HCHAR;
  326.     break;
  327.     case 4:
  328.     b_charsize(FNT5X9);
  329.     term->v_char = FNT5X9_VCHAR;
  330.     term->h_char = FNT5X9_HCHAR;
  331.     break;
  332.     }
  333.     /* rotate plot -90 degrees by reversing XMAX and YMAX and by 
  334.        setting b_rastermode to TRUE */
  335.     b_makebitmap(HPLJII_YMAX, HPLJII_XMAX, 1);
  336.     b_rastermode = TRUE;
  337. }
  338.  
  339.  
  340. /* 0 compression raster bitmap dump. Compatible with HP DeskJet 500
  341.    hopefully compatible with other HP Deskjet printers */
  342. TERM_PUBLIC void HPDJtext()
  343. {
  344.     register int x, j, row;
  345.  
  346.     fprintf(gpoutfile, "\
  347. \033*b0M\
  348. \033*t%dR\
  349. \033*r1A",
  350.         HPLJII_PPI);
  351.  
  352.     /* dump bitmap in raster mode */
  353.     for (x = b_xsize - 1; x >= 0; x--) {
  354.     row = (b_ysize / 8) - 1;
  355.     fprintf(gpoutfile, "\033*b%dW", b_ysize / 8);
  356.     for (j = row; j >= 0; j--) {
  357.         (void) fputc((char) (*((*b_p)[j] + x)), gpoutfile);
  358.     }
  359.     }
  360.     fputs("\033*rbC", gpoutfile);
  361.  
  362.     b_freebitmap();
  363.  
  364. #ifndef VMS            /* most vms spoolers add a formfeed character */
  365.     putc('\f', gpoutfile);
  366. #endif /* !VMS */
  367. }
  368.  
  369. #endif
  370.  
  371. #ifdef TERM_TABLE
  372.  
  373. TERM_TABLE_START(hpljii_driver)
  374.     "hpljii", "HP Laserjet series II, [75 100 150 300]",
  375.     HPLJII_75PPI_XMAX, HPLJII_75PPI_YMAX, HPLJII_75PPI_VCHAR,
  376.     HPLJII_75PPI_HCHAR, HPLJII_75PPI_VTIC, HPLJII_75PPI_HTIC, HPLJIIoptions,
  377.     HPLJIIinit, HPLJIIreset, HPLJIItext, null_scale,
  378.     HPLJIIgraphics, HPLJIImove, HPLJIIvector, HPLJIIlinetype,
  379.     HPLJIIput_text, HPLJIItext_angle, null_justify_text, line_and_point,
  380.     do_arrow, set_font_null, 0, TERM_BINARY
  381. TERM_TABLE_END(hpljii_driver)
  382.  
  383. #undef LAST_TERM
  384. #define LAST_TERM hpljii_driver
  385.  
  386. TERM_TABLE_START(hpdj_driver)
  387.     "hpdj", "HP DeskJet 500, [75 100 150 300]",
  388.     HPLJII_75PPI_XMAX, HPLJII_75PPI_YMAX, HPLJII_75PPI_VCHAR,
  389.     HPLJII_75PPI_HCHAR, HPLJII_75PPI_VTIC, HPLJII_75PPI_HTIC, HPLJIIoptions,
  390.     HPLJIIinit, HPLJIIreset, HPDJtext, null_scale,
  391.     HPDJgraphics, HPLJIImove, HPLJIIvector, HPLJIIlinetype,
  392.     HPDJput_text, HPDJtext_angle, null_justify_text, line_and_point,
  393.     do_arrow, set_font_null, 0, TERM_BINARY
  394. TERM_TABLE_END(hpdj_driver)
  395.  
  396. #undef LAST_TERM
  397. #define LAST_TERM hpdj_driver
  398.  
  399. #endif
  400. #endif
  401.  
  402. #ifdef TERM_HELP
  403. START_HELP(hpljii)
  404. "1 hpljii",
  405. "?commands set terminal hpljii",
  406. "?set terminal hpljii",
  407. "?set term hpljii",
  408. "?terminal hpljii",
  409. "?term hpljii",
  410. "?hpljii",
  411. "?commands set terminal hpdj",
  412. "?set terminal hpdj",
  413. "?set term hpdj",
  414. "?terminal hpdj",
  415. "?term hpdj",
  416. "?hpdj",
  417. " The `hpljii` terminal driver supports the HP Laserjet Series II printer.  The",
  418. " `hpdj` driver supports the HP DeskJet 500 printer.  These drivers allow a",
  419. " choice of resolutions.",
  420. "",
  421. " Syntax:",
  422. "       set terminal hpljii | hpdj {<res>}",
  423. "",
  424. " where `res` may be 75, 100, 150 or 300 dots per inch; the default is 75.",
  425. " Rasterization at the higher resolutions may require a large amount of memory.",
  426. "",
  427. " The `hp500c` terminal is similar to `hpdj`; `hp500c` additionally supports",
  428. " color and compression."
  429. END_HELP(hpljii)
  430. #endif /* TERM_HELP */
  431.